// 简单的 JWT 解析与过期校验工具

/**
 * 解析 JWT 的 payload
 * @param {string} token JWT 字符串
 * @returns {object|null} 解析后的 payload；解析失败返回 null
 */
export function parseJwtPayload(token) {
  if (!token || typeof token !== 'string') return null;
  const parts = token.split('.');
  if (parts.length !== 3) return null;
  try {
    const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
    const json = decodeURIComponent(
      atob(base64)
        .split('')
        .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
        .join('')
    );
    return JSON.parse(json);
  } catch (e) {
    return null;
  }
}

/**
 * 判断 token 是否已过期
 * 逻辑：优先使用 JWT 的 exp；如无 exp，尝试读取本地存储的过期时间；都无则认为未知（返回 false）
 * @param {string} token JWT 字符串
 * @param {number|undefined} fallbackExpireAtMs 备用过期时间（毫秒时间戳）
 * @returns {boolean} 是否已过期
 */
export function isTokenExpired(token, fallbackExpireAtMs) {
  const nowMs = Date.now();

  // 1) 从 JWT exp 判断（秒）
  const payload = parseJwtPayload(token);
  if (payload && typeof payload.exp === 'number') {
    return nowMs >= payload.exp * 1000;
  }

  // 2) 无 exp，使用备用过期时间（毫秒）
  if (typeof fallbackExpireAtMs === 'number') {
    return nowMs >= fallbackExpireAtMs;
  }

  // 3) 未知格式，无法判断，默认视为未过期（交由服务端 401 处理）
  return false;
}

/**
 * 读取本地 token 及可选的过期时间
 */
export function getStoredAuth() {
  const token = localStorage.getItem('userToken') || sessionStorage.getItem('userToken') || '';
  const expireAtStr = localStorage.getItem('userTokenExpireAt') || sessionStorage.getItem('userTokenExpireAt');
  const expireAt = expireAtStr ? Number(expireAtStr) : undefined;
  return { token, expireAt };
}

/**
 * 清理本地认证信息
 */
export function clearStoredAuth() {
  localStorage.removeItem('userToken');
  localStorage.removeItem('userTokenExpireAt');
  localStorage.removeItem('userId');
  localStorage.removeItem('classId');
  sessionStorage.removeItem('userToken');
  sessionStorage.removeItem('userTokenExpireAt');
  sessionStorage.removeItem('userInfo');
}



